package com.chanzany.proxy.jdk;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyFactory {
    private final SellTickets seller;

    ProxyFactory(SellTickets seller) {
        this.seller = seller;
    }

    public SellTickets getProxyObject() {
        return (SellTickets) Proxy.newProxyInstance(seller.getClass().getClassLoader(),
                seller.getClass().getInterfaces(), new InvocationHandler() {
                    /*
                       InvocationHandler中invoke方法参数说明：
                           proxy ： 代理对象
                           method ： 对应于在代理对象上调用的接口方法的 Method 实例
                           args ： 代理对象调用接口方法时传递的实际参数
                    */
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        Object result = null;
                        //执行真实对象的方法
                        if (method.getName().equals("sell")) {
                            System.out.println("代理点收取服务费5元");
                            result = method.invoke(seller, args);
                            System.out.println("代理点从火车站买到票了");
                        }
                        return result;
                    }
                });
    }
}